﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EntidadesDeNegocio
{
    public class Robot:Componente
    {
        /// <summary>
        /// Lista de componente que componente al robot
        /// </summary>
        public List<Componente> ListaComposicion { get; set; }
        /// <summary>
        /// Constructor con parametros
        /// </summary>
        /// <param name="modelo"></param>
        /// <param name="numeroSerie"></param>
        /// <param name="medio"></param>
        /// <param name="costo"></param>
        /// <param name="descripcion"></param>
        /// <param name="fechaCreacion"></param>
        /// <param name="cantidad"></param>
        public Robot(string modelo, string numeroSerie, MedioComponente medio, decimal costo, string descripcion, DateTime fechaCreacion, int cantidad,DateTime fechaService,List<Componente> listComp)
            : base(modelo, numeroSerie, medio, costo, descripcion, fechaCreacion, cantidad,fechaService) 
        {
            if(listComp!=null)            
                ListaComposicion = listComp;
            else
                ListaComposicion = new List<Componente>();
        }
        /// <summary>
        /// Constructor sin parametros
        /// </summary>
        public Robot() 
        {
            ListaComposicion = new List<Componente>();
        }       
        /// <summary>
        /// Devuelve el tipo de la clase
        /// </summary>
        /// <returns></returns>
        public override TipoComponente GetTipo()
        {
            return TipoComponente.Robot;
        }
        /// <summary>
        /// Agrega un componente a la lista de componentes
        /// </summary>
        /// <param name="componente"></param>
        public override void AgregarComponente(Componente componente)
        {
            ListaComposicion.Add(componente);
        }
        /// <summary>
        /// Elimina un componente a la lista de componentes
        /// </summary>
        /// <param name="componente"></param>
        public override void ElimnarComponente(Componente componente)
        {
            ListaComposicion.Remove(componente);
        }
        public override Componente Clone()
        {
            Robot retorno = new Robot(this.Modelo, this.NumeroSerie, this.Medio, this.Costo, this.Descripcion, this.FechaCreacion, this.Cantidad, this.FechaService,this.ListaComposicion);
            retorno.Oid = this.Oid;
            return retorno;
        }
        /// <summary>
        /// Obtiene el componente
        /// </summary>
        /// <param name="modelo"></param>
        /// <returns></returns>
        public override Componente ObtenerComponente(string modelo)
        {
            if (this.Modelo.Equals(modelo))
                return this;
            else
            {
                Componente comp=null;
                foreach (Componente c in ListaComposicion)
                {
                    comp=c.ObtenerComponente(modelo);
                    if (comp != null)
                    {
                        return comp;
                    }
                }
                return comp;
            }

        }
        /// <summary>
        /// Acepta visitor
        /// </summary>
        /// <param name="visitor"></param>
        public override void AceptarVisitor(IVisitor visitor)
        {
            visitor.VisitorRobot(this);
        }
    }
}
